package com.aote.mvc.event;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.w3c.dom.Element;

import com.browsesoft.ExtendElement;
import com.browsesoft.Tools;
import com.browsesoft.htmlcomponent.HTMLBasicComponent;

/**
 * 事件处理器，根据表单界面组件的事件，在表单界面组件上找相应的处理动作
 */
public class EventProcessor implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 对应的组件
	 */
	private HTMLBasicComponent component;

	/**
	 * 对应的动作处理工厂
	 */
	private ActionFactory actionFactory;

	public EventProcessor(HTMLBasicComponent component) {
		this.component = component;
		// 构造对应的动作处理工厂
		this.actionFactory = new ActionFactory(component);
	}

	/**
	 * 处理事件
	 */
	public void processEvent(String event, HttpServletRequest request, Map attrs) {
		// 找到事件配置，没有，不处理
		Element config = this.getEventElement(event);
		if (config == null) {
			return;
		}
		// 处理事件配置元素的动作
		this.doAction(config, request, attrs);
	}

	/**
	 * 根据事件配置的动作，执行动作处理。一个事件可以配置多个动作，动作名称之间用“，”分割
	 */
	private void doAction(Element config, HttpServletRequest request, Map attrs) {
		// 对于每一个动作，执行动作
		String str = config.getAttribute("actions");
		Iterator iter = Tools.stringToLinkedList(str).iterator();
		while (iter.hasNext()) {
			String action = (String) iter.next();
			this.actionFactory.doAction(action, request, attrs);
		}
	}

	/**
	 * 找到事件配置元素
	 */
	private Element getEventElement(String event) {
		List l = ExtendElement.findElementsByTagName(component.getElement(),
				"event", "name", event);
		// 没有找到，返回空
		if (l.size() == 0) {
			return null;
		}
		return (Element) l.get(0);
	}
}
